home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / t_os / book / src / vector.c < prev    next >
C/C++ Source or Header  |  1993-07-08  |  3KB  |  111 lines

  1. /*
  2.         High-C サンプルプログラム (割り込みベクタの変更)
  3.               int 24h (I/Oリクエストエラー処理) のフック
  4.                                         by Y.Kurihara (Nif PDC01620)
  5.  
  6.         ↑これをちょっと手直ししたもの
  7. */
  8.  
  9. #include <stdio.h>
  10. #include <stdefs.h>
  11. #include <stdlib.h>
  12. #include <msdos.cf>
  13. #include <interrup.cf>
  14.  
  15.  
  16. /*  CTRL-C割り込み(int 23h) および 致命的エラー割り込み(int 24h) のトラップ  */
  17.  
  18. typedef struct {
  19.     int selecter ;      /*  プロテクトモード割り込みベクタのセレクタ    */
  20.     int offset ;        /*  プロテクトモード割り込みベクタのオフセット  */
  21.     int real_vect ;     /*  リアルモード割り込みベクタ                  */
  22. } vector_t ;
  23.  
  24. vector_t    int23, int24 ;
  25.  
  26.  
  27. #pragma Calling_convention( C_interrupt ) ; /*  割り込みルーチン開始  */
  28.  
  29. void    int23h( Machine_status Stat )
  30. {
  31.     Stat.Flags = Stat.Flags ;   /*  dummy  */
  32.     return ;                    /*  iret  */
  33. }
  34.  
  35. void    int24h( Machine_status Stat )
  36. {
  37.     Stat.AX = 0 ;               /*  system call fault  */
  38.     return ;                    /*  iret  */
  39. }
  40.  
  41. #pragma Calling_convention() ;              /*  割り込みルーチン終了  */
  42.  
  43.  
  44. void    dos_extender_call( int interrupt, int param )
  45. {
  46.     Registers.DS.W = getds() ;
  47.     Registers.AX.W = interrupt ;
  48.     Registers.CX.W = param ;
  49.     calldos() ;
  50. }
  51.  
  52. void    set_vector( void )
  53.         /*  int 23h/24h の割り込みベクタを int23h()/int24h() に変更  */
  54. {
  55.     union {
  56.         _far void (*ptr)() ;
  57.         struct {  unsigned int off ;  unsigned short seg ;  }  reg ;
  58.     } farptr23h, farptr24h ;
  59.  
  60.     /*  int 23h の退避  */
  61.     dos_extender_call( 0x2502, 0x0023 ) ;
  62.     int23.selecter = Registers.ES.W ;
  63.     int23.offset = Registers.BX.R ;
  64.  
  65.     dos_extender_call( 0x2503, 0x0023 ) ;
  66.     int23.real_vect = Registers.BX.R ;
  67.  
  68.     farptr23h.ptr = (_far void (*)())int23h ;
  69.     Registers.DS.W = farptr23h.reg.seg ;
  70.     Registers.AX.W = 0x2506 ;
  71.     Registers.CX.W = 0x0023 ;
  72.     Registers.DX.R = farptr23h.reg.off ;
  73.     calldos() ;
  74.  
  75.     /*  int 24h の退避  */
  76.     dos_extender_call( 0x2502, 0x0024 ) ;
  77.     int24.selecter = Registers.ES.W ;
  78.     int24.offset = Registers.BX.R ;
  79.  
  80.     dos_extender_call( 0x2503, 0x0024 ) ;
  81.     int24.real_vect = Registers.BX.R ;
  82.  
  83.     farptr24h.ptr = (_far void (*)())int24h ;
  84.     Registers.DS.W = farptr24h.reg.seg ;
  85.     Registers.AX.W = 0x2506 ;
  86.     Registers.CX.W = 0x0024 ;
  87.     Registers.DX.R = farptr24h.reg.off ;
  88.     calldos() ;
  89. }
  90.  
  91. void    reset_vector( void )
  92.         /*  int 23h/24h の割り込みベクタを元に戻す  */
  93. {
  94.     /*  int 23h の復帰  */
  95.     Registers.AX.W = 0x2507 ;
  96.     Registers.CX.W = 0x0023 ;
  97.     Registers.DS.W = int23.selecter ;
  98.     Registers.DX.R = int23.offset ;
  99.     Registers.BX.R = int23.real_vect ;
  100.     calldos() ;
  101.  
  102.     /*  int 24h の復帰  */
  103.     Registers.AX.W = 0x2507 ;
  104.     Registers.CX.W = 0x0024 ;
  105.     Registers.DS.W = int24.selecter ;
  106.     Registers.DX.R = int24.offset ;
  107.     Registers.BX.R = int24.real_vect ;
  108.     calldos() ;
  109. }
  110.  
  111.